package com.example.naodian.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.naodian.domain.dto.PageDto;
import com.example.naodian.domain.po.EegDataBlock;
import com.example.naodian.domain.vo.EegDataBlockVO;
import com.example.naodian.mapper.EegDataBlockMapper;
import com.example.naodian.service.IEegDataBlockService;
import com.example.naodian.websocket.WebSocketServer;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;


import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author icewx
 * @since 2025-04-10
 */
@Service
@AllArgsConstructor
public class EegDataBlockServiceImpl extends ServiceImpl<EegDataBlockMapper, EegDataBlock> implements IEegDataBlockService {

    private final WebSocketServer webSocketServer;


    /**
     * 获取时间集合
     * @return list集合
     */
    @Override
    public List<String> timeList() {
        //查询所有时间，并去重
        List<String> timeList = baseMapper.timeList();
        return keepFourDecimalFractionByList(timeList);
    }

    /**
     * 获取所有点位信息(可以传某个时间段查询信息)
     * @param time 某个时间段(非必须)
     * @return EegDataBlockVO集合
     */
    @Override
    public List<EegDataBlockVO> eegList(String time) {
        //根据时间查询EegDataBlock集合
        List<EegDataBlock> eegDataBlocks = baseMapper.eegList(time);
        //使用stream流把EegDataBlock集合中的time改为四位小数
        List<EegDataBlock> list = eegDataBlocks.stream().map(eeg -> {
            //获取原集合中的时间
            String oldTime = eeg.getTime();
            //调用方法把time只保留四位小数
            eeg.setTime(keepFourDecimalFraction(oldTime));
            return eeg;
        }).collect(Collectors.toList());
        System.out.println("list = " + list.size());
        //使用集合拷贝的方法将EegDataBlock转为EegDataBlockVO
        List<EegDataBlockVO> eegDataBlockVOList = BeanUtil.copyToList(list, EegDataBlockVO.class);
        // 通过 WebSocket 发送数据到前端
//        sendEegDataToWebSocket(eegDataBlockVOList);
        return eegDataBlockVOList;
    }

    /**
     * 通过 WebSocket 发送 EegDataBlockVO 数据到前端
     * @param eegDataBlockVOList 数据列表
     */
    private void sendEegDataToWebSocket(List<EegDataBlockVO> eegDataBlockVOList) {
        // 将数据转换为 JSON 字符串
        String jsonString = JSONUtil.toJsonStr(eegDataBlockVOList);
        // 通过 WebSocket 广播数据
        WebSocketServer.broadcast(jsonString);
    }


    /**
     * 把list集合中的时间保留四位小数
     * @param list 参数
     * @return
     */
    private List<String> keepFourDecimalFractionByList(List<String> list){
        //使用stream把传入的集合中的time保留四位小数
        List<String> newList = list.stream().map(time -> {
                    double value = Double.parseDouble(time);
                    return String.format("%.2f", value);
                })
                .collect(Collectors.toList());
        return newList;
    }

    /**
     * 把传入的time保留四位小数
     * @param time 参数
     * @return
     */
    private String keepFourDecimalFraction(String time){
        double value = Double.parseDouble(time);
        return String.format("%.2f", value);
    }

    @Override
    public List<EegDataBlock> getInfoById(Long id) {
        return lambdaQuery().eq(EegDataBlock::getId,id).list();
    }

    @Override
    public List<EegDataBlockVO> pageQuery(PageDto pageDto) {
        int page = pageDto.getPage();
        List<EegDataBlock> list = baseMapper.pageQuery(pageDto);
        return BeanUtil.copyToList(list, EegDataBlockVO.class);
    }
}

